/*
 * JInternalFrameRepresentaciones.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Created on 3/08/2010, 08:18:13 PM
 */

package com.ufps.cuatro.vistas;

import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;

import org.jdesktop.application.Action;
import org.jdesktop.application.Task;

import com.ufps.cuatro.CuatroApp;
import com.ufps.cuatro.modelo.analizador.ObjetoReflexion;
import com.ufps.cuatro.modelo.analizador.UtilAnalizador;
import com.ufps.cuatro.modelo.representacion.componente.Componente;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGenerador;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorClaseCompleja;
import com.ufps.cuatro.modelo.representacion.ObjetoTipoDatoReflexion;
import com.ufps.cuatro.modelo.representacion.UtilRepresentacion;
import com.ufps.cuatro.util.Bandera;
import com.ufps.cuatro.util.ImplementarAyudaStandar;
import com.ufps.cuatro.util.InformacionNodo;
import com.ufps.cuatro.util.TipoCaso;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.generadores.GeneradorArbol;
import com.ufps.cuatro.util.generadores.GeneradorComponentes;
import com.ufps.cuatro.util.generadores.GeneradorGUI;
import com.ufps.cuatro.controlador.listener.ControllerListenerPopupJTree;
import com.ufps.cuatro.util.render.MyTreeCellRender;
import com.ufps.cuatro.controlador.render.UtilRender;
import com.ufps.cuatro.vistas.representacion.JDialogSeleccionPropiedadesClase;

/**
 * <i><b>JInternalFrameRepresentaciones:</b></i> @DefinicionClase
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 3/08/2010
 * @ see javax.swing.JInternalFrame
 * @see Observer
 * @see ImplementarAyudaStandar
 */
public class JInternalFrameRepresentaciones extends javax.swing.JInternalFrame implements Observer{
    private static final long serialVersionUID = -1668394502146215600L;

    private ObjetoTipoDatoReflexion objTipoDato;
    private Object objSeleccionado;
    private ArrayList<ObjetoReflexion> objPropiedadesClase;
    private int representacion;
    
    private int modo;
    
    private Integer[] opc;   

    /** Creates new form JInternalFrameRepresentaciones */
    public JInternalFrameRepresentaciones() {
        initComponents();
        this.setFrameIcon(Utileria.leerIconoApp(Utileria.MODO_16x16));
        UtilRender.helperRenderJList(jListTipos, UtilRepresentacion.objTypesData, Utileria.MODO_TIPOS);        
        this.jLabelClassPathTipoSeleccionado.setText(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JInternalFrameRepresentaciones").getString("SELECCIONE UN TIPO"));
        this.jLabelIconoCaso.setText("");
        this.jLabelDescripcionCaso.setText("");        
        this.crearArbol();
        this.objPropiedadesClase = new ArrayList<ObjetoReflexion>();
    }

    private void setIcono(String key){
        key = key.replaceAll(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JInternalFrameRepresentaciones").getString("16X16"), java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JInternalFrameRepresentaciones").getString("32X32"));
        ImageIcon icono = Utileria.leerRecursoImagen(key, 32);
        JLabel labelIcono = new JLabel(icono);
        this.jLabelIconoCaso.setIcon(labelIcono.getIcon());        
        this.jLabelClassPathTipoSeleccionado.setText(objTipoDato.getStrClassPath());
        this.jLabelDescripcionCaso.setText(Utileria.getDescripcionCaso(objTipoDato));
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel2 = new javax.swing.JPanel();
        jLabelIconoCaso = new javax.swing.JLabel();
        jLabelDescripcionCaso = new javax.swing.JLabel();
        jPanel3 = new javax.swing.JPanel();
        jLabelClassPathTipoSeleccionado = new javax.swing.JLabel();
        jLabel1 = new javax.swing.JLabel();
        jSplitPane1 = new javax.swing.JSplitPane();
        jScrollPane1 = new javax.swing.JScrollPane();
        jListTipos = new javax.swing.JList();
        jScrollPane3 = new javax.swing.JScrollPane();
        jTreeComponentes = new javax.swing.JTree();
        jLabel2 = new javax.swing.JLabel();
        jToolBar1 = new javax.swing.JToolBar();
        jButton1 = new javax.swing.JButton();
        jSeparator1 = new javax.swing.JToolBar.Separator();
        jButton3 = new javax.swing.JButton();
        jSeparator3 = new javax.swing.JToolBar.Separator();
        jButton5 = new javax.swing.JButton();
        jSeparator4 = new javax.swing.JToolBar.Separator();
        jButton2 = new javax.swing.JButton();

        setClosable(true);
        setResizable(true);
        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance().getContext().getResourceMap(JInternalFrameRepresentaciones.class);
        setTitle(resourceMap.getString("Form.title")); // NOI18N
        setName("Form"); // NOI18N

        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("jPanel2.border.title"))); // NOI18N
        jPanel2.setToolTipText(resourceMap.getString("jPanel2.toolTipText")); // NOI18N
        jPanel2.setName("jPanel2"); // NOI18N

        jLabelIconoCaso.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabelIconoCaso.setBorder(javax.swing.BorderFactory.createCompoundBorder(null, javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)));
        jLabelIconoCaso.setName("jLabelIconoCaso"); // NOI18N
        jLabelIconoCaso.setOpaque(true);

        jLabelDescripcionCaso.setText(resourceMap.getString("jLabelDescripcionCaso.text")); // NOI18N
        jLabelDescripcionCaso.setVerticalAlignment(javax.swing.SwingConstants.TOP);
        jLabelDescripcionCaso.setAutoscrolls(true);
        jLabelDescripcionCaso.setName("jLabelDescripcionCaso"); // NOI18N

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabelIconoCaso, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jLabelDescripcionCaso, javax.swing.GroupLayout.DEFAULT_SIZE, 628, Short.MAX_VALUE)
                .addContainerGap())
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabelDescripcionCaso, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 30, Short.MAX_VALUE)
                    .addComponent(jLabelIconoCaso, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 30, Short.MAX_VALUE))
                .addContainerGap())
        );

        jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("jPanel3.border.title"))); // NOI18N
        jPanel3.setName("jPanel3"); // NOI18N

        jLabelClassPathTipoSeleccionado.setText(resourceMap.getString("jLabelClassPathTipoSeleccionado.text")); // NOI18N
        jLabelClassPathTipoSeleccionado.setName("jLabelClassPathTipoSeleccionado"); // NOI18N

        jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
        jLabel1.setName("jLabel1"); // NOI18N

        jSplitPane1.setDividerLocation(250);
        jSplitPane1.setDividerSize(10);
        jSplitPane1.setAutoscrolls(true);
        jSplitPane1.setName("jSplitPane1"); // NOI18N
        jSplitPane1.setOneTouchExpandable(true);

        jScrollPane1.setName("jScrollPane1"); // NOI18N

        jListTipos.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jListTipos.setName("jListTipos"); // NOI18N
        jListTipos.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                jListTiposValueChanged(evt);
            }
        });
        jScrollPane1.setViewportView(jListTipos);

        jSplitPane1.setLeftComponent(jScrollPane1);

        jScrollPane3.setName("jScrollPane3"); // NOI18N

        jTreeComponentes.setName("jTreeComponentes"); // NOI18N
        jTreeComponentes.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
            public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
                jTreeComponentesValueChanged(evt);
            }
        });
        jScrollPane3.setViewportView(jTreeComponentes);

        jSplitPane1.setRightComponent(jScrollPane3);

        jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N
        jLabel2.setName("jLabel2"); // NOI18N

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 693, Short.MAX_VALUE)
                    .addComponent(jLabelClassPathTipoSeleccionado, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 693, Short.MAX_VALUE)
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 254, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, 433, Short.MAX_VALUE)))
                .addContainerGap())
        );
        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jLabel2))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 285, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabelClassPathTipoSeleccionado, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        jToolBar1.setFloatable(false);
        jToolBar1.setRollover(true);
        jToolBar1.setName("jToolBar1"); // NOI18N

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance().getContext().getActionMap(JInternalFrameRepresentaciones.class, this);
        jButton1.setAction(actionMap.get("addRepresentacion")); // NOI18N
        jButton1.setFocusable(false);
        jButton1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton1.setName("jButton1"); // NOI18N
        jButton1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton1);

        jSeparator1.setName("jSeparator1"); // NOI18N
        jToolBar1.add(jSeparator1);

        jButton3.setAction(actionMap.get("addRepresentacionSilenciosa")); // NOI18N
        jButton3.setFocusable(false);
        jButton3.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton3.setName("jButton3"); // NOI18N
        jButton3.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton3);

        jSeparator3.setName("jSeparator3"); // NOI18N
        jToolBar1.add(jSeparator3);

        jButton5.setAction(actionMap.get("cancelar")); // NOI18N
        jButton5.setFocusable(false);
        jButton5.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton5.setName("jButton5"); // NOI18N
        jButton5.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton5);

        jSeparator4.setName("jSeparator4"); // NOI18N
        jToolBar1.add(jSeparator4);

        jButton2.setAction(actionMap.get("infoHelp")); // NOI18N
        jButton2.setFocusable(false);
        jButton2.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton2.setName("jButton2"); // NOI18N
        jButton2.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton2);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 745, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jListTiposValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_jListTiposValueChanged
        if(this.jListTipos.isSelectionEmpty())return;
        objTipoDato = (ObjetoTipoDatoReflexion) this.jListTipos.getSelectedValue();
        this.setIcono(Utileria.getPathIconoCaso(objTipoDato.getObjCaso().geteCaso()));
    }

    @Action
    public void addRepresentacion() {
        if(this.jListTipos.isSelectionEmpty()){
            Utileria.mostrarMensaje(this, java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JInternalFrameRepresentaciones").getString("NO HA SELECCIONADO UN TIPO DE DATO."), "", JOptionPane.WARNING_MESSAGE);
            return;
        }     
        this.modo = Utileria.INDEFINIDO;
        this.modoRepresentacion();
        
    }//GEN-LAST:event_jListTiposValueChanged

    private void jTreeComponentesValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_jTreeComponentesValueChanged
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) (evt.getPath().getLastPathComponent());
        Object nodeInfo = node.getUserObject();
        InformacionNodo objNodoSeleccionado = (InformacionNodo) nodeInfo;
        try {            
            this.objSeleccionado = objNodoSeleccionado.getObjElemento();
            if (node.isRoot()) {
                //El nodo seleccionado es la raiz del arbol                
            } else if (node.isLeaf()) {
                //El nodo seleccionado es una hoja                
            } else {
                //El nodo seleccionado es una rama                
            }  
            this.createPopupMenu();
        } catch (java.lang.ClassCastException ex) {
            Logger.getLogger(JInternalFrameRepresentaciones.class.getName()).log(Level.SEVERE, null, ex);            
        }
    }//GEN-LAST:event_jTreeComponentesValueChanged

    /**
     * @DefinicionMetodo
     */
    @Action
    public void editRepresentacion() {                
    }

    /**
     * @DefinicionMetodo
     */
    @Action
    public void delRepresentacion() {        
    }

    /**
     * @DefinicionMetodo
     * @return @DefinicionReturn
     */
    public ObjetoTipoDatoReflexion getObjTipoDato() {
        return objTipoDato;
    }

    /**
     * @DefinicionMetodo
     * @param objTipoDato @DefinicionParametro
     */
    public void setObjTipoDato(ObjetoTipoDatoReflexion objTipoDato) {
        this.objTipoDato = objTipoDato;
    }
    
    public void update(Observable o, Object arg) {
        if(o instanceof Bandera){            
            Bandera objBandera = (Bandera) o;
            if(objBandera.getEstado() == Bandera.COMPONENTE_GENERADOR_CREADO){
                if(objBandera.getObj() instanceof ComponenteDistribuidorGenerador){
                    ComponenteDistribuidorGenerador objTempComponenteGenerador = (ComponenteDistribuidorGenerador) objBandera.getObj();                    
                    this.addComponenteGenerador(objTempComponenteGenerador);                    
                }		
            }
            else if(objBandera.getEstado() == Bandera.PROPIEDADES_ACTUALIZADAS){
                this.crearArbol();                
            }             
            else if(objBandera.getEstado() == Bandera.UPDATE_COMPONENTE){
                if(objBandera.getObj() instanceof ComponenteDistribuidorGenerador){
                    ComponenteDistribuidorGenerador objComponente = 
                            (ComponenteDistribuidorGenerador) objBandera.getObj();
                    this.setContenedor(objComponente);
                }                    
            } 
            else if(objBandera.getEstado() == Bandera.SELECCION_PROPIEDADES_CLASE_REPRESENTACION){
                if(objBandera.getObj() != null){
                    ArrayList<ObjetoReflexion> objPropiedades = (ArrayList<ObjetoReflexion>) objBandera.getObj();
                    int modoOperacion = objBandera.getInt();
                    ComponenteDistribuidorGeneradorClaseCompleja objTempComponenteGenerador = 
                            GeneradorComponentes.construirComponenteGeneradorClaseCompleja(objTipoDato, objPropiedades, true);
                    if(objTempComponenteGenerador != null){
                        this.addComponenteGenerador(objTempComponenteGenerador);                        
                        if(objBandera.isOpcion(Bandera.OPC_AGREGAR_COMPONENTE_BIBLIOTECA_GLOBAL)){
                            this.addComponenteGeneradorToBibliotecaGlobal(objTempComponenteGenerador);
                        }
                    }                    
                }
            }
        }
    }
    
    private void setContenedor(ComponenteDistribuidorGenerador objComponenteGenerador){  
        if(UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesGeneradores().contains(objComponenteGenerador)){
            int i = UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesGeneradores().indexOf(objComponenteGenerador);
            UtilRepresentacion.objBibliotecaTrabajoLocal.set(i, objComponenteGenerador);            
            this.crearArbol();                    
        }        
    }
    
   

    /**
     * @DefinicionMetodo
     * @return
     */
    public int getModo() {
        return modo;
    }  
    
    private void modoRepresentacion(){  
        if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.ePrimitivo){            
            JFrame mainFrame = null;        
            mainFrame = CuatroApp.getApplication().getMainFrame();                
            JDialogCrearComponenteManual objDialogCrearComponente = new JDialogCrearComponenteManual(this, objTipoDato);
            objDialogCrearComponente.setLocationRelativeTo(mainFrame);                
            CuatroApp.getApplication().show(objDialogCrearComponente);
        }
        else if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.eJDKRegistrado){
            JFrame mainFrame = null;        
            mainFrame = CuatroApp.getApplication().getMainFrame();                
            JDialogCrearComponenteManual objDialogCrearComponente = new JDialogCrearComponenteManual(this, objTipoDato);
            objDialogCrearComponente.setLocationRelativeTo(mainFrame);                
            CuatroApp.getApplication().show(objDialogCrearComponente);
        }        
        else if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.eClaseMundo){
            JFrame mainFrame = CuatroApp.getApplication().getMainFrame();
            JDialogSeleccionPropiedadesClase objDialog = new JDialogSeleccionPropiedadesClase(this);            
            objDialog.setLocationRelativeTo(mainFrame);        
            CuatroApp.getApplication().show(objDialog);             
        }        
        else if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.eJDKNoRegistrado){
//            JInternalFrameComponenteGeneradorClase objVentana = new JInternalFrameComponenteGeneradorClase(this);
//            Utileria.objEscritorio.add(objVentana);
//            objVentana.setVisible(true);
        }
    }
    
    private boolean crearArbol(){
        DefaultMutableTreeNode objRaiz = 
                new DefaultMutableTreeNode(new InformacionNodo(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JInternalFrameRepresentaciones").getString("REPRESENTACIONES")));
        ArrayList<ComponenteDistribuidorGenerador> objComponentes = 
                UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesGeneradores();
                GeneradorArbol.crearEstructuraComponentes(objRaiz, objComponentes);                                   
        JTree objArbol = new JTree(objRaiz);
        this.jTreeComponentes.setModel(objArbol.getModel());
        MyTreeCellRender objRender = new MyTreeCellRender(Utileria.ARBOL_COMPONENTES);
        this.jTreeComponentes.setCellRenderer(objRender);        
        this.jTreeComponentes.setSelectionRow(0);            
        return true;
    }

    /**
     * @DefinicionMetodo
     * @return
     */
    @Action
    public Task vistaRepresentacion() {
        if(objSeleccionado instanceof ComponenteDistribuidorGenerador){
            ComponenteDistribuidorGenerador objComponenteGenerador =
                        (ComponenteDistribuidorGenerador) objSeleccionado;                
//            if(!objComponenteGenerador.isFinish()){
//                Utileria.mostrarMensaje(this, "El Componente esta siendo Editado.", "", JOptionPane.WARNING_MESSAGE);
//                return null;
//            }
            return new VistaRepresentacionTask(org.jdesktop.application.Application.getInstance(com.ufps.cuatro.CuatroApp.class));
        }
        return null;
    }

    

    private class VistaRepresentacionTask extends org.jdesktop.application.Task<Object, Void> {
        VistaRepresentacionTask(org.jdesktop.application.Application app) {            
            super(app);
        }
        @Override protected Object doInBackground() {            
            try {
                setProgress(20, 0, 100);
                setMessage(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/asistente/resources/JInternalFrameComponentesContenedores").getString("GENERANDO INTERFAZ DE CONTROLES."));
                Thread.sleep(500);
                return GeneradorGUI.crearVistaPreviaPanel((Componente) objSeleccionado);
            } catch (InterruptedException ex) {
                Logger.getLogger(JInternalFrameRepresentaciones.class.getName()).log(Level.SEVERE, null, ex);
            }
            return null;
        }
        @Override protected void succeeded(Object result) {            
            if(result == null){
                try {
                    setProgress(0, 0, 100);
                    setMessage(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/asistente/resources/JInternalFrameComponentesContenedores").getString("LA VISTA PREVIA NO HA SIDO GENERADA."));
                    Thread.sleep(500);
                    return;
                } catch (InterruptedException ex) {
                    Logger.getLogger(JInternalFrameRepresentaciones.class.getName()).log(Level.SEVERE, null, ex);                    
                }
            }
            else{
                try {
                    setProgress(99, 0, 100);
                    setMessage(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/asistente/resources/JInternalFrameComponentesContenedores").getString("INTERFAZ GENERADA CORRECTAMENTE."));
                    Thread.sleep(500);                    
                    JPanel objPanel = (JPanel) result;
                    JFrame objFrame = CuatroApp.getApplication().getMainFrame();
                    JDialog objVentana = new JDialog();                                        
                    Componente objComponente = (Componente) objSeleccionado;
                    objVentana.setTitle(objComponente.getName()); 
                    objVentana.add(objPanel);
                    objVentana.setLocationRelativeTo(objFrame);
                    objVentana.setModal(true);
                    CuatroApp.getApplication().show(objVentana);
                } catch (InterruptedException ex) {
                    Logger.getLogger(JInternalFrameRepresentaciones.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }        
    }   

    /**
     * Permite cargarArchivoMyPropierties la Ventana de Ayuda
     */
    @Action
    public void infoHelp() {
        UtilRender.openDialogHelp(JInternalFrameRepresentaciones.class, getTitle());
    }
    
    private void createPopupMenu() {        
        ControllerListenerPopupJTree objMyPopup = new ControllerListenerPopupJTree(this, jTreeComponentes, objSeleccionado);
        this.jTreeComponentes.addMouseListener(objMyPopup);                    
    }
    
    /**
     * @DefinicionMetodo
     * @return
     */
    public Object getObjSeleccionado() {
        return objSeleccionado;
    }

    /**
     * @DefinicionMetodo
     */
    @Action
    public void addRepresentacionSilenciosa() {
        if(this.jListTipos.isSelectionEmpty()){
            Utileria.mostrarMensaje(this, "Debe Seleccionar un Tipo de Dato.", "", JOptionPane.WARNING_MESSAGE);
            return;
        }        
        else{
            ObjetoTipoDatoReflexion objTipoTemp = (ObjetoTipoDatoReflexion) this.jListTipos.getSelectedValue();
            if(objTipoTemp.getObjCaso().geteCaso() == TipoCaso.eClaseMundo){
                Utileria.mostrarMensaje(this, "Los Tipos de Dato: Clase Mundo requieren Configuracion Manual.", "", JOptionPane.WARNING_MESSAGE);
                return;
            }
        }
        JFrame mainFrame = null;        
        mainFrame = CuatroApp.getApplication().getMainFrame();                
        JDialogCrearComponentePatron objDialogCrearComponente = new JDialogCrearComponentePatron(this);
        objDialogCrearComponente.setLocationRelativeTo(mainFrame);                
        CuatroApp.getApplication().show(objDialogCrearComponente);         
    }    

    /**
     * Permite cancelar el poceso de creacion de representacion sin guardar cambios
     */
    @Action
    public void cancelar() {
        if(Utileria.confirmarOrden(CuatroApp.getApplication().getMainFrame(), java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JInternalFrameRepresentaciones").getString("¿DESEA CANCELAR EL PROCESO?"), ""))
            dispose();
    }

    /**
     * @DefinicionMetodo
     */
    @Action
    public void editComponente() {        
    }

    /**
     * @DefinicionMetodo
     * @return
     */
    public Integer[] getOpc() {
        return opc;
    }

    public ArrayList<ObjetoReflexion> getObjPropiedadesClase() {
        return objPropiedadesClase;
    }

    public int getRepresentacion() {
        return representacion;
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton5;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabelClassPathTipoSeleccionado;
    private javax.swing.JLabel jLabelDescripcionCaso;
    private javax.swing.JLabel jLabelIconoCaso;
    private javax.swing.JList jListTipos;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JToolBar.Separator jSeparator1;
    private javax.swing.JToolBar.Separator jSeparator3;
    private javax.swing.JToolBar.Separator jSeparator4;
    private javax.swing.JSplitPane jSplitPane1;
    private javax.swing.JToolBar jToolBar1;
    private javax.swing.JTree jTreeComponentes;
    // End of variables declaration//GEN-END:variables
    
    private boolean addComponenteGenerador(ComponenteDistribuidorGenerador objComponenteGeneradorNuevo){
        try{
            if(UtilRepresentacion.objBibliotecaTrabajoLocal.add(objComponenteGeneradorNuevo)){                                        
                if(!UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesGeneradores().isEmpty()){
                    this.crearArbol();
                }                
            }                 
            return true;
        }catch(java.lang.Exception ex){            
        }
        return false;
    }
    
    private boolean addComponenteGeneradorToBibliotecaGlobal(ComponenteDistribuidorGenerador objComponenteGeneradorNuevo){        
        try{
            if(UtilRepresentacion.objBibliotecaTrabajoGlobal.add(objComponenteGeneradorNuevo)){                                        
                if(Utileria.guardarBiblioteca(UtilAnalizador.eliminarExtension(System.getProperty("user.dir") + Utileria.separador + "CuatroLib"),
                        UtilRepresentacion.objBibliotecaTrabajoGlobal)){                                                        
                    System.out.println("Componente: " + objComponenteGeneradorNuevo.getName() + " Agregado a la Biblioteca Global");
                }
            }        
            return true;
        }catch(java.lang.Exception ex){            
        }
        return false;
    }
    
}
